/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package coop.demanda.habitacional;

import java.io.IOException;
import java.io.Serializable;
import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.inject.Named;
//import org.apache.log4j.Logger;
import org.primefaces.model.chart.PieChartModel;

/**
 *
 * @author Dell
 */
@Named("estadisticasBean")
@SessionScoped
public class EstadisticasBean implements Serializable {

    @EJB
    private EstadisticasService estadisticasService;

    private Municipio municipioSeleccionado;
    private int cantDemandas;
    private int cantDeViviendasNuevas;
    private int cantDemandasTienenVivienda;
    
    private int cantDemandasNoTienenVivienda;

    public int getCantDemandasNoTienenVivienda() {
        return cantDemandasNoTienenVivienda;
    }
    
    public void setCantDemandasNoTienenVivienda(int cantDemandasNoTienenVivienda) {
        this.cantDemandasNoTienenVivienda = cantDemandasNoTienenVivienda;
    }

    private int cantIntegrantesNoTienenVivienda;

    public int getCantIntegrantesNoTienenVivienda() {
        return cantIntegrantesNoTienenVivienda;
    }

    public void setCantIntegrantesNoTienenVivienda(int cantIntegrantesNoTienenVivienda) {
        this.cantIntegrantesNoTienenVivienda = cantIntegrantesNoTienenVivienda;
    }
    
    private int cantIntegrantesTienenVivienda;


    public int getCantIntegrantesTienenVivienda() {
        return cantIntegrantesTienenVivienda;
    }

    public void setCantIntegrantesTienenVivienda(int cantIntegrantesTienenVivienda) {
        this.cantIntegrantesTienenVivienda = cantIntegrantesTienenVivienda;
    }
 
    private int cantDeIntegrantes;
    private int cantDeIntegrantesViviendaNueva;
    private int cantDeViviendasRefaccion;
    private int cantDeIntegrantesRefaccion;
    private int cantDeViviendasConexionInterna;
    private int cantDeIntegrantesConexionInterna;
    private int cantDeViviendasConexionExterna;
    private int cantDeIntegrantesConexionExterna;
    private int cantDeViviendasAlquila;
    private int cantDeIntegrantesAlquila;
    private int cantDeViviendasPrestada;
    private int cantDeIntegrantesPrestada;
    private int cantDeViviendasPropia;
    private int cantDeIntegrantesPropia;
    private int cantDeViviendasOcupa;
    private int cantDeIntegrantesOcupa;
    private int cantNoTienenViviendas;

    private int cantDeHabitantes;

    private int sinDemandas;
    
//    private Logger log;

    public int getSinDemandas() {
        return sinDemandas;
    }

    public void setSinDemandas(int sinDemandas) {
        this.sinDemandas = sinDemandas;
    }

    public int getCantHabitantes() {
        return cantDeHabitantes;
    }

    /**
     * Set the value of cantHabitantes
     *
     * @param cantHabitantes new value of cantHabitantes
     */
    public void setCantHabitantes(int cantHabitantes) {
        this.cantDeHabitantes = cantHabitantes;
    }

    public int getCantNoTienenViviendas() {
        return cantNoTienenViviendas;
    }

    public void setCantNoTienenViviendas(int cantNoTienenViviendas) {
        this.cantNoTienenViviendas = cantNoTienenViviendas;
    }

    private PieChartModel graficoPorVinculo;

    private PieChartModel graficoPorMotivo;

    public PieChartModel getGraficoPorMotivo() {
        return graficoPorMotivo;
    }

    public void setGraficoPorMotivo(PieChartModel graficoPorMotivo) {
        this.graficoPorMotivo = graficoPorMotivo;
    }

    //@PostConstruct
    public void inicializa() {
        createPieModels();
    }

    private void createPieModels() {
        createPieModelVinculo();
        createPieModelMotivo();
    }

    private void createPieModelVinculo() {
        graficoPorVinculo = new PieChartModel();
        graficoPorVinculo.set("alquila", getCantDeViviendasAlquila());
        graficoPorVinculo.set("prestada", getCantDeViviendasPrestada());
        graficoPorVinculo.set("propia", getCantDeViviendasPropia());
        graficoPorVinculo.set("ocupa", getCantDeViviendasOcupa());
    }

    private void createPieModelMotivo() {
        graficoPorMotivo = new PieChartModel();
        graficoPorMotivo.set("Tienen vivienda", getCantDeViviendasPropia());
        graficoPorMotivo.set("No Tienen Vivienda", getCantNoTienenViviendas());
        graficoPorMotivo.set("No Efectuaron Demanda", getSinDemandas());
    }

    public PieChartModel getGraficoPorVinculo() {
        return graficoPorVinculo;
    }

    public void setGraficoPorVinculo(PieChartModel charModel1) {
        this.graficoPorVinculo = charModel1;
    }

    public int getCantDeIntegrantesOcupa() {
        return cantDeIntegrantesSegunVinculo("Ocupo");
    }

    public void setCantDeIntegrantesOcupa(int cantDeIntegrantesOcupa) {
        this.cantDeIntegrantesOcupa = cantDeIntegrantesOcupa;
    }

    public int getCantDeViviendasOcupa() {
        return cantDeDemandasSegunVinculo("Ocupo");
    }

    public void setCantDeViviendasOcupa(int cantDeViviendasOcupa) {
        this.cantDeViviendasOcupa = cantDeViviendasOcupa;
    }

    public int getCantDeIntegrantesPropia() {
        return cantDeIntegrantesSegunVinculo("Propia");
    }

    public void setCantDeIntegrantesPropia(int cantDeIntegrantesPropia) {
        this.cantDeIntegrantesPropia = cantDeIntegrantesPropia;
    }

    public int getCantDeViviendasPropia() {
        return cantDeViviendasPropia;
    }

    public void setCantDeViviendasPropia(int cantDeViviendasPropia) {
        this.cantDeViviendasPropia = cantDeViviendasPropia;
    }

    public int getCantDeIntegrantesPrestada() {
        return cantDeIntegrantesSegunVinculo("Prestada");
    }

    public void setCantDeIntegrantesPrestada(int cantDeIntegrantesPrestada) {
        this.cantDeIntegrantesPrestada = cantDeIntegrantesPrestada;
    }

    public int getCantDeViviendasPrestada() {
        return cantDeViviendasPrestada;
    }

    public void setCantDeViviendasPrestada(int cantDeViviendasPrestada) {
        this.cantDeViviendasPrestada = cantDeViviendasPrestada;
    }

    public int getCantDeIntegrantesAlquila() {
        return cantDeIntegrantesSegunVinculo("Alquilo");
    }

    public void setCantDeIntegrantesAlquila(int cantDeIntegrantesAlquila) {
        this.cantDeIntegrantesAlquila = cantDeIntegrantesAlquila;
    }

    public int getCantDeViviendasAlquila() {
        return cantDeViviendasAlquila;
    }

    public void setCantDeViviendasAlquila(int cantDeViviendasAlquila) {
        this.cantDeViviendasAlquila = cantDeViviendasAlquila;
    }

    public int getCantDeIntegrantesConexionExterna() {
        return cantDeIntegrantesSegunDemanda("Servicios - conexiones externas");
    }

    public void setCantDeIntegrantesConexionExterna(int cantDeIntegrantesConexionExterna) {
        this.cantDeIntegrantesConexionExterna = cantDeIntegrantesConexionExterna;
    }

    public int getCantDeViviendasConexionExterna() {
        return cantDeViviendasSegunDemanda("Servicios - conexiones externas");

    }

    public void setCantDeViviendasConexionExterna(int cantDeViviendasConexionExterna) {
        this.cantDeViviendasConexionExterna = cantDeViviendasConexionExterna;
    }

    public int getCantDeIntegrantesConexionInterna() {
        return cantDeIntegrantesSegunDemanda("Servicios- conexiones internas");
    }

    public void setCantDeIntegrantesConexionInterna(int cantDeIntegrantesConexionInterna) {
        this.cantDeIntegrantesConexionInterna = cantDeIntegrantesConexionInterna;
    }

    public int getCantDeViviendasConexionInterna() {
        return cantDeViviendasSegunDemanda("Servicios- conexiones internas");
    }

    public void setCantDeViviendasConexionInterna(int cantDeViviendasConexionInterna) {
        this.cantDeViviendasConexionInterna = cantDeViviendasConexionInterna;
    }

    public int getCantDeIntegrantesRefaccion() {
        return cantDeIntegrantesSegunDemanda("Refacción, ampliación, mejoramiento");
    }

    public void setCantDeIntegrantesRefaccion(int cantDeIntegrantesRefaccion) {
        this.cantDeIntegrantesRefaccion = cantDeIntegrantesRefaccion;
    }

    public int getCantDeViviendasRefaccion() {
        return cantDeViviendasSegunDemanda("Refacción, ampliación, mejoramiento");
    }

    public void setCantDeViviendasRefaccion(int cantDeViviendasRefaccion) {
        this.cantDeViviendasRefaccion = cantDeViviendasRefaccion;
    }

    public int getCantDeIntegrantesViviendaNueva() {
        return cantDeIntegrantesSegunDemanda("Vivienda nueva");
    }

    public void setCantDeIntegrantesViviendaNueva(int cantDeIntegrantesViviendaNueva) {
        this.cantDeIntegrantesViviendaNueva = cantDeIntegrantesViviendaNueva;
    }

//    public EstadisticasBean() {
//        this.log = Logger.getLogger(EstadisticasBean.class);
//    }

    public Municipio getMunicipioSeleccionado() {
        return municipioSeleccionado;
    }

    public void setMunicipioSeleccionado(Municipio municipioSeleccionado) {
        //this.setCantHabitantes(municipioSeleccionado.getCantidadHabitantes());
        this.municipioSeleccionado = municipioSeleccionado;
    }

    public int getCantDemandas() {
        return cantDemandas;
    }

    public void setCantDemandas(int cantDemandas) {
        this.cantDemandas = cantDemandas;
    }

    public int getCantDeIntegrantes() {
        return cantDeIntegrantes;
    }

    public void setCantDeIntegrantes(int cantDeIntegrantes) {

        this.cantDeIntegrantes = cantDeIntegrantes;
    }

    public int getCantDeViviendasNuevas() {
        return cantDeViviendasSegunDemanda("Vivienda nueva");
    }

    public void setCantDeViviendasNuevas(int cantDeViviendasNuevas) {
        this.cantDeViviendasNuevas = cantDeViviendasNuevas;
    }

    public int getCantDemandasTienenVivienda() {
        return cantDemandasTienenVivienda;
    }

    public void setCantDemandasTienenVivienda(int cantDemandasTienenVivienda) {
        this.cantDemandasTienenVivienda = cantDemandasTienenVivienda;
    }

    
    
    private int cantDeViviendasSegunDemanda(String demanda) {
        Municipio municipio = this.getMunicipioSeleccionado();
        return estadisticasService.getCantDeViviendasSegunDemanda(municipio, demanda);
    }

    private int cantDeIntegrantesSegunDemanda(String demanda) {
        Municipio municipio = this.getMunicipioSeleccionado();
        return estadisticasService.getCantDeIntegrantesPorNecesidad(municipio, demanda);
    }

    private int cantDeDemandasSegunVinculo(String vinculo) {
        Municipio municipio = this.getMunicipioSeleccionado();
        return estadisticasService.getCantDeViviendasSegunVinculo(municipio, vinculo);
    }

    private int cantDeIntegrantesSegunVinculo(String vinculo) {
        Municipio municipio = this.getMunicipioSeleccionado();
        return estadisticasService.getCantDeIntegrantesPorVinculo(municipio, vinculo);
    }

    public void mostrarEstadisticas() throws IOException {
        inicializaCalculos();
        FacesContext facesContext = FacesContext.getCurrentInstance();
        ExternalContext context = facesContext.getExternalContext();
        context.redirect("estadisticasPorMunicipio.xhtml");
    }

    public void graficos() throws IOException {
        inicializa();
        FacesContext facesContext = FacesContext.getCurrentInstance();
        ExternalContext context = facesContext.getExternalContext();
        context.redirect("graficos.xhtml");
    }

    public void listener(ActionEvent event) {
        setMunicipioSeleccionado((Municipio) event.getComponent().getAttributes().get("municipio"));
    }
    
    public void inicializaCalculos(){
        
        // Total de demandas con cantidad cantidad de personas
        setCantDemandas(estadisticasService.getCantDemandas(getMunicipioSeleccionado()));
        
        setCantDemandasNoTienenVivienda(estadisticasService.getCantDemandasNoTienenVivienda(getMunicipioSeleccionado()));
        setCantDemandasTienenVivienda(estadisticasService.getCantDemandasTienenVivienda(getMunicipioSeleccionado()));
        setCantIntegrantesNoTienenVivienda(estadisticasService.getCantIntegrantesNoTienenVivienda(getMunicipioSeleccionado()));
        setCantIntegrantesTienenVivienda(estadisticasService.getCantIntegrantesTienenVivienda(getMunicipioSeleccionado()));
        
        setCantDeIntegrantes(estadisticasService.getCantDeIntegrantes(getMunicipioSeleccionado()));
        
        // Viviendas nuevas
        // TODO: Corregir servicio
//        setCantDeViviendasNuevas(estadisticasService.getCantDeViviendasNuevas());
        
        // Ampliacion, refaccion y mejoramiento
        
        
        // Servicios-conexiones internas
        
         // Servicios-conexiones externas
        
        // Alquilan
        
        // Prestada
        
        // Propia
        
        // Ocupa
        
        // Tienen vivienda
        
        // No tienen vivienda
        
        
        setCantDeViviendasPropia(cantDeDemandasSegunVinculo("Propia"));
        setCantDeViviendasAlquila(cantDeDemandasSegunVinculo("Alquilo"));
        setCantDeIntegrantesOcupa(cantDeDemandasSegunVinculo("Ocupo"));
        setCantDeViviendasPrestada(cantDeDemandasSegunVinculo("Prestada"));
       
        setCantHabitantes(getMunicipioSeleccionado().getCantidadHabitantes());
//        setCantDeViviendasPropia(estadisticasService.getCantDeIntegrantesTienenVivienda(getMunicipioSeleccionado()));
        

        setCantNoTienenViviendas(getCantDeIntegrantes() - getCantDeViviendasPropia());
        setSinDemandas(municipioSeleccionado.getCantidadHabitantes() - getCantDeIntegrantes());
        
    }
}
